<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body></body>
  <script>
    // 数据源
    const dataSource = [
      {
        id: 1,
        label: "Level one 1",
        children: [
          {
            id: 4,
            label: "Level two 1-1",
            children: [
              {
                id: 9,
                label: "Level three 1-1-1",
              },
              {
                id: 10,
                label: "Level three 1-1-2",
              },
            ],
          },
        ],
      },
      {
        id: 2,
        label: "Level one 2",
        children: [
          {
            id: 5,
            label: "Level two 2-1",
          },
          {
            id: 6,
            label: "Level two 2-2",
          },
        ],
      },
      {
        id: 3,
        label: "Level one 3",
        children: [
          {
            id: 7,
            label: "Level two 3-1",
          },
          {
            id: 8,
            label: "Level two 3-2",
          },
        ],
      },
    ];
    // 查找父节点
    function findP(id, list = [], result = []) {
      for (let i = 0; i < list.length; i += 1) {
        console.log("*******", list[i].id, "********");
        const item = list[i];
        // 找到目标
        if (item.id === id) {
          console.log("找到了");
          // 加入到结果中
          result.push(item.id);
          // 因为可能在第一层就找到了结果，直接返回当前结果
          if (result.length === 1) return result;
          return true;
        }
        // 如果存在下级节点，则继续遍历
        if (item.children) {
          // 预设本次是需要的节点并加入到最终结果result中
          result.push(item.id);
          const find = findP(id, item.children, result);
          // 如果不是false则表示找到了，直接return，结束递归
          if (find) {
            return result;
          }
          // 到这里，意味着本次并不是需要的节点，则在result中移除
          result.pop();
        }
      }
      // 如果都走到这儿了，也就是本轮遍历children没找到，将此次标记为false
      return false;
    }

    console.log("最终：", findP(9, dataSource));
  </script>
</html>
